From 981c3c9b243dfa4a8f6b0528eaabc5831649cb44 Mon Sep 17 00:00:00 2001 From: "Michael.Fetterman@cl.cam.ac.uk" Date: Mon, 28 Nov 2005 15:09:44 +0100 Subject: [PATCH] Allow __gpfn_to_mfn() to automatically deal with translated domains != current. Renamed gpfn_to_mfn_foreign() to get_mfn_from_pfn_foreign(), making it more consistent with get_mfn_from_pfn(). --- xen/arch/x86/shadow32.c | 4 ++-- xen/arch/x86/shadow_public.c | 4 ++-- xen/common/grant_table.c | 2 +- xen/include/asm-x86/shadow.h | 28 +++++++--------------------- xen/include/xen/perfc_defn.h | 2 +- 5 files changed, 13 insertions(+), 27 deletions(-) diff --git a/xen/arch/x86/shadow32.c b/xen/arch/x86/shadow32.c index bcbbdd5cc2..132a4a1486 100644 --- a/xen/arch/x86/shadow32.c +++ b/xen/arch/x86/shadow32.c @@ -1423,7 +1423,7 @@ int shadow_mode_control(struct domain *d, dom0_shadow_control_t *sc) } unsigned long -gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn) +get_mfn_from_pfn_foreign(struct domain *d, unsigned long gpfn) { unsigned long va, tabpfn; l1_pgentry_t *l1, l1e; @@ -1431,7 +1431,7 @@ gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn) ASSERT(shadow_mode_translate(d)); - perfc_incrc(gpfn_to_mfn_foreign); + perfc_incrc(get_mfn_from_pfn_foreign); va = gpfn << PAGE_SHIFT; tabpfn = pagetable_get_pfn(d->arch.phys_table); diff --git a/xen/arch/x86/shadow_public.c b/xen/arch/x86/shadow_public.c index 36454f9e51..5d7d5b7844 100644 --- a/xen/arch/x86/shadow_public.c +++ b/xen/arch/x86/shadow_public.c @@ -1607,7 +1607,7 @@ remove_shadow(struct domain *d, unsigned long gpfn, u32 stype) } unsigned long -gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn) +get_mfn_from_pfn_foreign(struct domain *d, unsigned long gpfn) { unsigned long va, tabpfn; l1_pgentry_t *l1, l1e; @@ -1615,7 +1615,7 @@ gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn) ASSERT(shadow_mode_translate(d)); - perfc_incrc(gpfn_to_mfn_foreign); + perfc_incrc(get_mfn_from_pfn_foreign); va = gpfn << PAGE_SHIFT; tabpfn = pagetable_get_pfn(d->arch.phys_table); diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 97b3ca0aa0..c2c15c7e59 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -234,7 +234,7 @@ __gnttab_map_grant_ref( /* rmb(); */ /* not on x86 */ - frame = __gpfn_to_mfn_foreign(rd, sha->frame); + frame = __gpfn_to_mfn(rd, sha->frame); if ( unlikely(!pfn_valid(frame)) || unlikely(!((dev_hst_ro_flags & GNTMAP_readonly) ? diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index 05544a8bcd..58ecca6989 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -285,22 +285,19 @@ static inline void shadow_mode_disable(struct domain *d) #define __mfn_to_gpfn(_d, mfn) \ ( (shadow_mode_translate(_d)) \ - ? get_pfn_from_mfn(mfn) \ + ? get_pfn_from_mfn(mfn) \ : (mfn) ) #define __gpfn_to_mfn(_d, gpfn) \ ({ \ - (shadow_mode_translate(_d)) \ - ? get_mfn_from_pfn(gpfn) \ + unlikely(shadow_mode_translate(_d)) \ + ? (likely(current->domain == (_d)) \ + ? get_mfn_from_pfn(gpfn) \ + : get_mfn_from_pfn_foreign(_d, gpfn)) \ : (gpfn); \ }) -#define __gpfn_to_mfn_foreign(_d, gpfn) \ - ( (shadow_mode_translate(_d)) \ - ? gpfn_to_mfn_foreign(_d, gpfn) \ - : (gpfn) ) - -extern unsigned long gpfn_to_mfn_foreign( +extern unsigned long get_mfn_from_pfn_foreign( struct domain *d, unsigned long gpfn); /************************************************************************/ @@ -871,18 +868,7 @@ static inline void hl2e_propagate_from_guest( if ( l2e_get_flags(gpde) & _PAGE_PRESENT ) { - if ( unlikely((current->domain != d) && !shadow_mode_external(d)) ) - { - // Can't use __gpfn_to_mfn() if we don't have one of this domain's - // page tables currently installed. - // This isn't common -- it only happens during shadow mode setup - // and mode changes. - // - mfn = gpfn_to_mfn_foreign(d, pfn); - } - else - mfn = __gpfn_to_mfn(d, pfn); - + mfn = __gpfn_to_mfn(d, pfn); if ( VALID_MFN(mfn) && (mfn < max_page) ) hl2e = l1e_from_pfn(mfn, __PAGE_HYPERVISOR); } diff --git a/xen/include/xen/perfc_defn.h b/xen/include/xen/perfc_defn.h index 5326f3bdbc..1e6820acad 100644 --- a/xen/include/xen/perfc_defn.h +++ b/xen/include/xen/perfc_defn.h @@ -114,7 +114,7 @@ PERFCOUNTER_CPU(shadow_get_page_fail, "shadow_get_page_from_l1e fails") PERFCOUNTER_CPU(validate_hl2e_calls, "calls to validate_hl2e_change") PERFCOUNTER_CPU(validate_hl2e_changes, "validate_hl2e makes changes") PERFCOUNTER_CPU(exception_fixed, "pre-exception fixed") -PERFCOUNTER_CPU(gpfn_to_mfn_foreign, "calls to gpfn_to_mfn_foreign") +PERFCOUNTER_CPU(get_mfn_from_pfn_foreign, "calls to get_mfn_from_pfn_foreign") PERFCOUNTER_CPU(remove_all_access, "calls to remove_all_access") PERFCOUNTER_CPU(remove_write_access, "calls to remove_write_access") PERFCOUNTER_CPU(remove_write_access_easy, "easy outs of remove_write_access") -- 2.30.2